ETCD组件在grpc中的实践 您所在的位置:网站首页 python etcd3与protobuf不兼容 ETCD组件在grpc中的实践

ETCD组件在grpc中的实践

2024-07-18 03:18| 来源: 网络整理| 查看: 265

一、前言

grpc中没有像go-micro那样集成可插拔式的etcd库使用,如何使得grpc能够使用服务注册发现及命名解析的功能,因此本文基于etcd实现了Name Resolver。

 

二、所需的grpc版本及高版本grpc、protobuf与etcd兼容问题

grpc相关库:

google.golang.org/grpc v1.26.0

google.golang.org/grpc/balancer/roundrobin

google.golang.org/grpc/resolver

 

etcd相关库:

go.etcd.io/etcd/clientv3

github.com/coreos/etcd/mvcc/mvccpb

 

此处需要注意的是,新版本grpc不兼容etcd相关库, 如果grpc版本大于1.26.0或者protobuf版本过高会出现以下问题:

1. grpc版本过高,新版本不支持etcd  需降级

# github.com/coreos/etcd/clientv3/balancer/picker ../../vendor/github.com/coreos/etcd/clientv3/balancer/picker/err.go:37:44: undefined: balancer.PickOptions ../../vendor/github.com/coreos/etcd/clientv3/balancer/picker/roundrobin_balanced.go:55:54: undefined: balancer.PickOptions # github.com/coreos/etcd/clientv3/balancer/resolver/endpoint ../../vendor/github.com/coreos/etcd/clientv3/balancer/resolver/endpoint/endpoint.go:114:78: undefined: resolver.BuildOption ../../vendor/github.com/coreos/etcd/clientv3/balancer/resolver/endpoint/endpoint.go:182:31: undefined: resolver.ResolveNowOption

解决办法:在go.mod 加入:replace google.golang.org/grpc => google.golang.org/grpc v1.26.0

2. grpc版本过低  protobuf版本过高

# ut-blogger/api/protos/user ../../api/protos/user/user.pb.go:327:11: undefined: grpc.SupportPackageIsVersion6 ../../api/protos/user/user.pb.go:338:5: undefined: grpc.ClientConnInterface

解决办法:降级protoc-gen-go的版本 go get github.com/golang/protobuf/[email protected] 重新生成proto

 

三、自定义实现naming

package etcdservice import ( "context" "go.etcd.io/etcd/clientv3" "log" "strings" "time" ) const Schema = "grpcEtcd" // Register 注册地址到ETCD组件中 使用 ; 分割 func Register(etcdAddr, name string, addr string, ttl int64) error { var err error if cli == nil { cli, err = clientv3.New(clientv3.Config{ Endpoints: strings.Split(etcdAddr, ";"), DialTimeout: 15 * time.Second, }) if err != nil { log.Printf("connect to etcd err:%s", err) return err } } ticker := time.NewTicker(time.Second * time.Duration(ttl)) go func() { for { getResp, err := cli.Get(context.Background(), "/"+Schema+"/"+name+"/"+addr) if err != nil { log.Printf("getResp:%+v\n", getResp) log.Printf("Register:%s", err) } else if getResp.Count == 0 { err = withAlive(name, addr, ttl) if err != nil { log.Printf("keep alive:%s", err) } }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有